﻿#include <learn/ais/ais_point.h>
#include <learn/ais/ais_vector.h>

using namespace xi;
using namespace xi::ais;

AIS_Point::AIS_Point(std::shared_ptr<Vec3> point) : m_point(point)
{
    this->m_collisionFunc = [&](AIS_MouseMsg *msg) -> bool {
        // 获得屏幕点和鼠标位置
        Vec3f Q = msg->toScreen(convert<float>(*m_point));
        Vec2f q(Q.x(), Q.y());
        Vec2f p = msg->move;

        // 如果在范围内，直接将深度设为 0
        if (Q.z() <= msg->depth && (p - q).modulus() <= 5)
        {
            msg->depth = 0;
            msg->obj = this;
            return true;
        }
        return false;
    };
}

std::shared_ptr<Vec3> AIS_Point::point() const
{
    return m_point;
}

void AIS_Point::visit(AIS_InitMsg *msg)
{
    // 利用工厂创建渲染器
    if (msg->factory)
        m_renderer.reset(msg->factory->create_product("AIS_Point"));
}

void AIS_Point::visit(AIS_MoveMsg *msg)
{
    Vec3 n = convert<double>(msg->dir);
    Vec3 p = convert<double>(msg->pos);
    *m_point = p + n * dot(n, *m_point - p);

    // 调用父类方法更新
    AIS_Object::visit(msg);
}